/**
 * 统一错误处理中间件
 * 捕获和处理应用中的错误
 */

const { errorResponse } = require('./responseHandler');
const logger = require('../utils/logger');

/**
 * 异步错误处理包装器
 * @param {Function} fn - 异步函数
 * @returns {Function} Express中间件函数
 */
const asyncHandler = (fn) => {
  return (req, res, next) => {
    Promise.resolve(fn(req, res, next)).catch(next);
  };
};

/**
 * 全局错误处理中间件
 * @param {Error} err - 错误对象
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - Express next函数
 */
const errorHandler = (err, req, res, next) => {
  // 记录错误日志
  logger.error('请求处理错误', {
    message: err.message,
    stack: err.stack,
    url: req.url,
    method: req.method,
    ip: req.ip,
  });

  // 根据错误类型返回相应的响应
  if (err.name === 'ValidationError') {
    return errorResponse(res, '数据验证失败', 400, err.message);
  }

  if (err.name === 'UnauthorizedError') {
    return errorResponse(res, '未授权访问', 401, err.message);
  }

  if (err.status) {
    return errorResponse(res, err.message, err.status, err.details);
  }

  // 默认服务器错误
  const isProduction = process.env.NODE_ENV === 'production';
  const message = isProduction ? '服务器内部错误' : err.message;

  return errorResponse(res, message, 500, isProduction ? null : err.stack);
};

/**
 * 404处理中间件
 */
const notFoundHandler = (req, res) => {
  return res.status(404).json({
    success: false,
    code: 404,
    message: '请求的资源不存在',
    path: req.path,
    timestamp: new Date().toISOString(),
  });
};

module.exports = {
  asyncHandler,
  errorHandler,
  notFoundHandler,
};

